#include "mycamera.h"

// 定义日志标签
static const char *TAG = "ESP32-S3-CAM";

// 初始化摄像头
esp_err_t init_camera(void)
{
    ESP_LOGI(TAG, "初始化摄像头...");  // 记录日志
    
    // 配置摄像头参数
    camera_config_t camera_config = {
        .pin_pwdn = CAM_PIN_PWDN,      // 电源下降引脚
        .pin_reset = CAM_PIN_RESET,    // 复位引脚
        .pin_xclk = CAM_PIN_XCLK,      // 主时钟引脚
        .pin_sccb_sda = CAM_PIN_SIOD,  // I2C数据引脚
        .pin_sccb_scl = CAM_PIN_SIOC,  // I2C时钟引脚
        
        // 数据引脚配置
        .pin_d7 = CAM_PIN_D7,
        .pin_d6 = CAM_PIN_D6,
        .pin_d5 = CAM_PIN_D5,
        .pin_d4 = CAM_PIN_D4,
        .pin_d3 = CAM_PIN_D3,
        .pin_d2 = CAM_PIN_D2,
        .pin_d1 = CAM_PIN_D1,
        .pin_d0 = CAM_PIN_D0,
        .pin_vsync = CAM_PIN_VSYNC,    // 垂直同步引脚
        .pin_href = CAM_PIN_HREF,      // 水平参考引脚
        .pin_pclk = CAM_PIN_PCLK,      // 像素时钟引脚
        
        .xclk_freq_hz = 10000000,      // 主时钟频率10MHz
        .ledc_timer = LEDC_TIMER_0,    // LEDC定时器
        .ledc_channel = LEDC_CHANNEL_0, // LEDC通道
        
        .pixel_format = PIXFORMAT_JPEG, // 像素格式为JPEG
        .frame_size = FRAMESIZE_SVGA,  // 帧尺寸为800x600
        .jpeg_quality = 6,            // JPEG质量（0-63，数值越小质量越高）
        .fb_count = 3,                 // 帧缓冲区数量
        .fb_location = CAMERA_FB_IN_PSRAM, // 帧缓冲区位置（内部RAM）
        .grab_mode = CAMERA_GRAB_LATEST, // 抓取模式（获取最新帧）
    };
    
    // 初始化摄像头驱动
    esp_err_t err = esp_camera_init(&camera_config);
    if (err != ESP_OK) {
        // 记录摄像头初始化失败日志
        ESP_LOGE(TAG, "摄像头初始化失败: 0x%" PRIx32, (uint32_t)err);
        return err;
    }
    
    // 获取摄像头传感器
    sensor_t *s = esp_camera_sensor_get();
    if (s == NULL) {
        ESP_LOGE(TAG, "获取摄像头传感器失败");  // 记录错误日志
        return ESP_FAIL;
    }
    
    // 调整传感器设置
    s->set_vflip(s, 1);    // 设置垂直翻转
    s->set_hmirror(s, 1);  // 设置水平镜像
    
    ESP_LOGI(TAG, "摄像头初始化成功");  // 记录成功日志
    return ESP_OK;
}

// 捕获图像
camera_fb_t* capture_image(void)
{
    // 从摄像头获取一帧图像
    camera_fb_t *fb = esp_camera_fb_get();
    if (!fb) {
        ESP_LOGE(TAG, "获取帧缓冲区失败");  // 记录错误日志
        return NULL;
    }
    return fb;
}

// 释放帧缓冲区
void return_fb_buffer(camera_fb_t* fb)
{
    if (fb) {
        esp_camera_fb_return(fb);  // 释放帧缓冲区
    }
}